package ihm.gestortareas;
/**
 * Aplicaci�n para la gesti�n de tareas creadas por el usuario, en donde
 * se puede a�adir descripci�n, fecha y prioridad
 * @author Pablo Gil, Josman P�rez
 * @version 1.0 
 */

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;


import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.ListView;
import android.widget.ArrayAdapter;

@SuppressLint("NewApi")
public class MainActivity extends Activity {
	/**
	 * Clase principal de la aplicaci�n, se encarga de gestionar el listView que 
	 * muestra las tareas agregadas por el usuario.
	 */
	
	public final static int ANADIR = 1;
	public final static String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE";
	ArrayAdapter<Model> adapter;
	List<Model> list;
	ListView listView;
	
    @Override  
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);        
        setContentView(R.layout.activity_main_layout);

        //Crear el ListView
        listView = (ListView) findViewById(R.id.listtareas);
        list=getModel();//Carga la lista del fichero
        
        //Crear adaptador
        adapter = new InteractiveArrayAdapter(this, list);
        
        //Asignar adaptador al ListView
        listView.setAdapter(adapter);
   
        registerForContextMenu(listView);
    }
    
    /**
     * M�todo para salir de la aplicaci�n que sobreescribe el m�todo de la clase
     * padre para guardar los datos del listView en un fichero y poder as� acceder
     * a ellos nuevamente al lanzar la aplicaci�n
     */
    protected void onDestroy(){
    	super.onDestroy();
    }
    
    protected void onStop() {
    	escribirFichero(list);
    	super.onStop();
    }
    /**
     * M�todo a�adirTareas que crea una nueva actividad para obterner los valores de 
     * esta nueva tarea
     * @param view listView donde se almacenan las actividades
     */
    public void anadirTareas(View view) {
        // Do something in response to button
    	Intent intent = new Intent(this, AnadirTarea.class);   	
    	startActivityForResult(intent,ANADIR);
    }
    
    /**
     * M�todo para gestionar el m�delo que se usa en el ListView
     * @return devuelve la lista cargandola del fichero
     */
    private List<Model> getModel() {   	
    	List<Model> list = new ArrayList<Model>();
        leerFichero(list);
        return list;
      }

    /**
     * 
     * @param s
     * @return
     */
    private Model get(String s) {
      return new Model(s);
    }
     
    /**
     * M�todo que lee el fichero en donde se almacenan las tareas para cargarlo en el listView.
     * Utiliza almacenamiento interno
     * @param list el m�delo que carga la lista del fichero
     */
    public void leerFichero(List<Model> list){
    	
		   InputStream inputStream;
			try {
				   inputStream = openFileInput("tareas.txt");
			
				   InputStreamReader inputreader = new InputStreamReader(inputStream);
				   BufferedReader buffreader = new BufferedReader(inputreader);
				   String line;
				   int i =0;
				   try {
				       while (( line = buffreader.readLine()) != null) {
				    
				    	   
				           list.add(get(line.substring(1).replace('+', '\n')));//A�ade la lista sin el primer valor que indica si la lista está hecha o no
				           if(line.startsWith("1")){
				        	   list.get(i).setSelected(true);
				           }
				    	
				           i++;
				       }
				       inputreader.close();
				       buffreader.close();
				       inputStream.close();
				       
				   } catch (IOException e) {
				       e.printStackTrace();
				   }
			} catch (FileNotFoundException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
    }
    
    /**
     * M�todo que almacena el m�delo en el archivo interno "tareas.txt" para guardar las
     * tareas agregadas por el usuario y poder acceder a ellas cuando se vuelva a lanzar
     * la aplicaci�n
     * @param list el m�delo que carga la lista del fichero
     */
    public void escribirFichero(List<Model> list){
    	try
    	{
    		final FileOutputStream outputStream = openFileOutput("tareas.txt", MODE_WORLD_WRITEABLE);
            for(Model m: list){
            	outputStream.write(m.isSelected()?("1"+m.getName().replace('\n', '+')).getBytes():("0"+m.getName().replace('\n', '+')).getBytes());
            	outputStream.write("\n".getBytes());
            }
    	    outputStream.close();
    	}
    	catch (Exception ex)
    	{
    	    Log.e("Ficheros", "Error al escribir fichero a memoria interna");
    	}
    	
    }
    	
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    	MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.activity_main_menu, menu);
        return true;
    }
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo info) {
    	super.onCreateContextMenu(menu, v, info);
    	MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.activity_context_menu, menu);
        
    }
    
    
    @Override
    public boolean onContextItemSelected(MenuItem item) {
        AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
        switch (item.getItemId()) {
            case R.id.eliminar:
                list.remove((int)info.id);             
                adapter.notifyDataSetChanged();
                return true;
            default:
                return super.onContextItemSelected(item);
        }
    }
    

    public boolean onOptionsItemSelected(MenuItem item){
        switch (item.getItemId()) {
            case R.id.eliminar:
            	list.clear();
            	adapter.notifyDataSetChanged();
                return true;
            case R.id.add:
            	anadirTareas(listView);
            	return true;
            default:
                return super.onContextItemSelected(item);
        }
    	
    }
   
    
   
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent i) {
    	if ((requestCode == ANADIR) && (resultCode == Activity.RESULT_OK)) {
    		System.out.println(i.getStringExtra(AnadirTarea.DESC));
    		System.out.println(i.getStringExtra(AnadirTarea.FECHA));
    		System.out.println(i.getStringExtra(AnadirTarea.PRIO));
    		list.add(get(i.getStringExtra(AnadirTarea.DESC)
    				+i.getStringExtra(AnadirTarea.FECHA)
    				+" - "+i.getStringExtra(AnadirTarea.PRIO)));
    		
    		
    		adapter.notifyDataSetChanged();
    	
	
    	}
    }
  
}
